//
// Created by lenfrex on 2022/4/4.
//

#ifndef WORK20220401_STRING_H
#define WORK20220401_STRING_H

#include <iostream>
#include <string>
#include "utility"

using namespace std::rel_ops;

class String {
private:
    // 字符数组做字符串
    char *data = nullptr;

    // 字符串实际长度
    int length = 0;

    // 已分配的字符数量
    int allocSize = 0;

    void copyData(const char *source, int sourceLength);

    bool equals(const char *source, int sourceLength) const;

    void addString(const char *source, int sourceLength);
public:
    explicit String(int size);

    String(const char *data, int length);

    explicit String(const char *source);

    String(const String &source);

    String();

    ~String();

    bool operator==(const String &source) const;

    bool operator==(const char *source) const;

    bool operator>(const String &compareString) const;

    String &operator+=(const String &source);

    String &operator+=(const char *source);

    String &operator=(const String &source);

    String &operator=(const char *source);

    String operator+(const char *source);

    String operator+(const String &source);

    friend std::ostream &operator<<(std::ostream &outputStream, const String &source);

    friend std::istream &operator>>(std::istream &outputStream, String &source);

    char &operator[](int i);

    int Length() const;

};

#endif //WORK20220401_STRING_H